package utils;

/**
 * 顺序线性表操作
 */
public class LineTableUtil extends AbstractLineClass {
    private int[] arrays;

    public LineTableUtil(int size) {
        super(size);
    }

    /**
     * 初始化顺序线性表
     */
    public void iniSortArray() {
        final int size = super.getSize();
        arrays = new int[size];
        for (int i = 0; i < size; i++) {
            arrays[i] = i;
        }
    }

    /**
     * 根据值，得到该值所在序号
     *
     * @param value        值
     * @param defaultValue 默认值
     * @return 位置，若没找到则返回-1
     */
    private int findDate(int value, int defaultValue) {
        int site = defaultValue;
        for (int i = 0; i < super.getSize(); i++) {
            if (arrays[i] == value)
                site = i;
        }
        return site;
    }

    /**
     * 根据值，删除顺序线性表中的元素
     *
     * @param value        值
     * @param defaultValue 默认值
     * @return 是否成功
     */
    public boolean deleteDataByValue(int value, int defaultValue) {
        int site = findDate(value, defaultValue);
        if (site == defaultValue)
            return false;
        return deleteData(site, defaultValue);
    }

    /**
     * 修改指定位置中的元素值
     *
     * @param site  序号
     * @param value 值
     * @return 是否成功
     */
    public boolean updateData(int site, int value) {
        if (!checkSite(site)) {
            return false;
        }
        arrays[site] = value;
        return true;
    }

    /**
     * 根据值，修改指定元素中的值
     *
     * @param oldValue     原值
     * @param newValue     新值
     * @param defaultValue 默认值
     * @return 是否成功
     */
    public boolean updateDataByValue(int oldValue, int newValue, int defaultValue) {
        final int site = findDate(oldValue, defaultValue);
        if (site == defaultValue)
            return false;
        return updateData(site, defaultValue);
    }

    /**
     * 根据指定位置，删除顺序线性表中的元素
     *
     * @param site         序号
     * @param defaultValue 默认值
     * @return 是否成功
     */
    public boolean deleteData(int site, int defaultValue) {
        if (!checkSite(site)) {
            return false;
        }
        for (int i = site; i < super.getSize() - 1; i++) {
            arrays[i] = arrays[i + 1];
        }
        arrays[super.getSize() - 1] = defaultValue;
        return true;
    }

    /**
     * 插入新元素至顺序线性表
     *
     * @param site 序号
     * @param data 数据
     * @return 是否成功
     */
    public boolean insertNewData(int site, int data) {
        if (!checkSite(site))
            return false;
        for (int i = super.getSize() - 1; i > site; i--) {
            arrays[i] = arrays[i - 1];
        }
        arrays[site] = data;
        return true;
    }

    /**
     * 打印顺序线性表
     */
    public void printArrays() {
        for (int i = 0; i < super.getSize(); i++) {
            final int value = arrays[i];
            System.out.println(String.format("序号：%d，值：%d", i, value));
        }
    }
}
